Grub详解

---------------推荐博客----------------------------------------------------
http://essun.blog.51cto.com/721033/1366045
http://www.mamicode.com/info-detail-1169442.html
http://www.centoscn.com/CentosBug/osbug/2014/0327/2671.html
CentOS 7 进入单用户模式：
    http://www.centoscn.com/CentOS/2015/0312/4864.html
------------------------------------------------------------------------------

Grub（GRand Unified Bootloader）是统一资源引导器，也就是引导加载器；它的工作是提供一个菜单，允许用户选择要启动的系统或不同的内核版本；把用户选定的内核装载到RAM中的特定空间中，然后解压、展开，而后把系统控制权移交给内核。

    它目前有两个版本：
                1、GRUB 0.X：Grub Legacy
                2、GRUB 1.X：Grub2
    注意：
            1，CentOS 6 使用 Grub Legacy
            2，CentOS 7 使用 Grub2

一、Grub Legacy 分为三个部分stage1、stage1_5和stage2。
    1、stage1：即写入mbr中存储的bootloader程序。它的任务就是将stage1_5（此时并不能算是磁盘分区/boot/grub/下的stage1_5,因为stage1无法识别文件系统）载入内存执行。

    2、stage1_5：位于mbr之后的扇区，通过提供基本文件系统驱动让stage1中的bootloader程序能识别磁盘分区/boot/grub/上的stage2文件并载入内存执行。
        注意：此处若是boot分区的文件系统类型不属于stage1_5的中的一个，则会借助ramdisk来加载在/lib64/moudles/下额外的文件系统驱动。

    3、stage2：这个程序主要给用户提供一个比较友好的启动菜单，而后去加载位于同一个磁盘分区/boot/的内核文件（例如 vmlinuz-2.6.32-573.el6.x86_64）


二、Grub Legacy的配置文件和功用
1、配置文件grub和内核等在一个目录，此外它创建了一个链接文件指向配置文件来保证用户使用配置文件一致性
            配置文件：/boot/grub/grub.conf <-- /etc/grub.conf
    配置项：
            default=#：设定默认启动的菜单项：菜单项（title）编号从0开始
            timeout=#：指定菜单项等待选项选择的时长；
            splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE：指明菜单背景图片文件路径；
            hiddemenu：隐藏菜单
            password [--md5] STRING：菜单编辑认证；

            title TITLE：定义菜单项“标题”，可出现多次；
                root（hd#，#）：grub查找stage2及kernel文件所在设备分区：为grub的“根”
                kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]：启动的内核
                initrd /PATH/TO/INITRAMFS_FILE：内核匹配的ramfs文件
                password [--md5] STRING：启动选定的内核或者操作系统进行认证；

2、功用
    （1）提供菜单、并提供交互式接口
            e：编辑模式，用于编辑菜单
            c：命令模式，交互式接口
    （2）加载用户选择的内核或操作系统
            允许传递参数给内核；可隐藏此菜单（通过grub.conf中的hiddenmenu）
    （3）为菜单提供了保护机制
            为编辑菜单进行认证（title上定义的password）
            为启用内核或者操作系统进行认证（title下的password字段）



三、Grub的命令行接口和编辑功能

    1、进入grub的命令行界面和编辑界面
     （1）启动机器时，按任意键键可进入grub界面
     （2）c：可进入命令行界面
     （3）e：进入编辑界面

    2、grub的命令行命令和编辑命令
      （1）grub的编辑命令
                b：boot，启动
                e：edit，编辑选中的项
                o：在选中行的下一行新加一行
                O：在选中行的上一行添加一行
                d：删除选中行
                ESC：可以退出编辑界面进入主界面

       （2）grub的命令行命令
                help：获取帮助信息（列出所有的命令）
                help KEYWORD：获取某一具体命令的帮助信息
                find (hd#,#)/PATH/TO/SOMEFFILE：查找文件（内核文件等）
                root (hd#,#)：设定那个磁盘是根，执行后，fnd不需指磁盘了；
                kernel /PATH/TO/KERNEL_FILE：设定本次启动时用到的内核文件；额外还可以添加许多内核支持使用的cmdline参数；
                          例如：init=/path/to/init, selinux=0
                initrd /PATH/TO/OMOTRAMFS_FILE：设定为选定的内核提供额外文件的ramdisk；
                boot：引导启动选定的内核；

            手动在grub命令行接口启动系统：
                grub> root (hd#,#)
                grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE 
                grub> initrd /initramfs-VERSION-RELEASE.img
                grub> boot

四：进入单用户模式 ：
        CentOS 6：
            （1）编辑grub菜单（选定要编辑的title，而后使用e命令）           
            （2）在选定的kernel后附加 1，s，S或single 都可以
            （3）ESC退出后在编辑界面，选中kernel所在行，键入"b"命令；

        CentOS 7：
        centos7的grub2界面会有两个入口，正常系统入口和救援模式，
        e 键进入edit 模式。
        找到以 linux16 开头的行，注意：只在该行里面进行操作。
            1：
                （1）把 ro更改成 rw ；（把只读更改成可写）
                （2）把 rhgb quiet 删除；（quiet静默模式，可以不删）
                （3）增加 init=/bin/bash；（或init=/bin/sh,指定shell环境)
                （4） 按下 ctrl+x 来启动系统。
                .....修改操作......
                （5）重启
            2：
                （1）该行最后输入 rd.break
                （2）ctrl+x 启动系统
                （3）进去后输入命令 mount，发现根为/sysroot/，并且不能写，只有ro=readonly权限；
                        mount -o remount,rw /sysroot/，重新挂载，之后mount，发现有了r,w权限；
                （4）chroot /sysroot/ 改变根
                 .....修改操作......
                （5）ctrl+d 或者 exit  退出
                （6）重启


五、grub的安装
（1）grub-install 命令
    使用格式：grub-install --root-directory=/PATH/TO/rootDIR DEVICE
    ~]# grub-install --root-directory=/ /dev/sda3
    ~]# sync

（2）grub命令（shell中输入）
        ~]# grub
        grub> root (hd0,0)
        grub> setup (hd0)
        grub> quit
        ~]# sync

（3）如果mbr中的bootloader程序损坏
        插入一个系统引导光盘，进入救援模式重新安装grub


五、grub损坏与备份。
    硬盘的0柱面、0磁头、1扇区称为主引导扇区（也叫主引导记录MBR）。

    三部分组成（共 512bytes）。
        446bytes：主引导程序、（boot loader）
        64bytes：硬盘分区表DPT（Disk Partition table）（4个分区，一个分区16bytes）
        2bytes：硬盘有效标志（55AA）。固定为55AA

    备份mbr：
        dd if=/dev/sda of=/root/mbr.bak count=1 bs=512

    破坏：
        dd if=/dev/zero of=/dev/sda bs=200 count=1
        分区表不能破坏，bs不能超过446bytes